package br.com.foxinline.modelo;

import br.com.foxinline.enums.GrauParentesco;
import br.com.foxinline.enums.OrientacaoSexual;
import br.com.foxinline.enums.RendaFamiliar;
import br.com.foxinline.enums.ResponsavelCrianca;
import br.com.foxinline.enums.SituacaoMercadoTrabalho;
import br.com.foxinline.enums.TempoSituacaoRua;
import br.com.foxinline.enums.TipoCurso;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.*;

/**
 *
 * @author laverson
 */
@Entity
public class CadastroIndividual implements Serializable, Cloneable {

    @Id
    @SequenceGenerator(sequenceName = "seq_cadastro_individual", name = "seq_cadastro_individual", allocationSize = 1)
    @GeneratedValue(generator = "seq_cadastro_individual", strategy = GenerationType.SEQUENCE)
    private Long id;
    @OneToOne
    private Usuario digitadoPor;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataDigitado;
    @OneToOne
    private Usuario conferidoPor;
    private Integer folhaNumero;
    @OneToOne
    private Profissional profissional;
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataCadastro;
    @OneToOne(cascade = {CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH})
    private Cidadao cidadao;
    private Boolean responsavelFamiliar;
    @OneToOne
    private Cidadao cartaoResponsavelFamiliar;
    private Boolean frequentaEscola;
    @Enumerated(EnumType.STRING)
    private TipoCurso tipoCurso;
    @Enumerated(EnumType.STRING)
    private SituacaoMercadoTrabalho situacaoMercadoTrabalho;
    @Enumerated(EnumType.STRING)
    private ResponsavelCrianca responsavelCrianca;
    private Boolean frequentaCurandeiro;
    private Boolean participaGrupoComunitario;
    private Boolean planoSaudePrivado;
    private Boolean membroComunidade;
    private String nomeComunidade;
    private Boolean informarOrientacaoSexual;
    @Enumerated(EnumType.STRING)
    private OrientacaoSexual orientacaoSexual;
    private Boolean possuiDeficiencia;
    @OneToMany
    private List<TipoDeficiencia> tipoDeficiencia;
    private Boolean situacaoDeRua;
    @Enumerated(EnumType.STRING)
    private TempoSituacaoRua tempoSituacaoRua;
    private Boolean acompanhadoOutraInstituicao;
    private String nomeOutraInstituicao;
    private Boolean recebeAlgumBeneficio;
    private Boolean possuiReferenciaFamiliar;
    private Boolean frequentaFamiliarFrequencia;
    private Boolean bolsaFamilia;
    private Boolean minhaCasaMinhaVida;
    private Boolean imovelProprio;
    @Enumerated(EnumType.STRING)
    private RendaFamiliar rendaFamiliar;
    @Enumerated(EnumType.STRING)
    private GrauParentesco grauParentesco;
    @OneToOne(cascade = {CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH})
    private QuestionarioAutoReferido questionarioAutoReferido;
    @OneToOne
    private CadastroIndividual cadastroHistorico;
    private Boolean atual = true;
    private Boolean ativo = true;
    @Version
    private int versao;

    public CadastroIndividual() {
        tipoDeficiencia = new ArrayList<TipoDeficiencia>();
        profissional = new Profissional();
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Usuario getDigitadoPor() {
        return digitadoPor;
    }

    public void setDigitadoPor(Usuario digitadoPor) {
        this.digitadoPor = digitadoPor;
    }

    public Date getDataDigitado() {
        return dataDigitado;
    }

    public void setDataDigitado(Date dataDigitado) {
        this.dataDigitado = dataDigitado;
    }

    public Usuario getConferidoPor() {
        return conferidoPor;
    }

    public void setConferidoPor(Usuario conferidoPor) {
        this.conferidoPor = conferidoPor;
    }

    public Integer getFolhaNumero() {
        return folhaNumero;
    }

    public void setFolhaNumero(Integer folhaNumero) {
        this.folhaNumero = folhaNumero;
    }

    public Date getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Date dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    public Cidadao getCidadao() {
        return cidadao;
    }

    public void setCidadao(Cidadao cidadao) {
        this.cidadao = cidadao;
    }

    public Boolean getResponsavelFamiliar() {
        return responsavelFamiliar;
    }

    public void setResponsavelFamiliar(Boolean responsavelFamiliar) {
        this.responsavelFamiliar = responsavelFamiliar;
    }

    public Cidadao getCartaoResponsavelFamiliar() {
        return cartaoResponsavelFamiliar;
    }

    public void setCartaoResponsavelFamiliar(Cidadao cartaoResponsavelFamiliar) {
        this.cartaoResponsavelFamiliar = cartaoResponsavelFamiliar;
    }

    public Boolean getFrequentaEscola() {
        return frequentaEscola;
    }

    public void setFrequentaEscola(Boolean frequentaEscola) {
        this.frequentaEscola = frequentaEscola;
    }

    public TipoCurso getTipoCurso() {
        return tipoCurso;
    }

    public void setTipoCurso(TipoCurso tipoCurso) {
        this.tipoCurso = tipoCurso;
    }

    public SituacaoMercadoTrabalho getSituacaoMercadoTrabalho() {
        return situacaoMercadoTrabalho;
    }

    public void setSituacaoMercadoTrabalho(SituacaoMercadoTrabalho situacaoMercadoTrabalho) {
        this.situacaoMercadoTrabalho = situacaoMercadoTrabalho;
    }

    public ResponsavelCrianca getResponsavelCrianca() {
        return responsavelCrianca;
    }

    public void setResponsavelCrianca(ResponsavelCrianca responsavelCrianca) {
        this.responsavelCrianca = responsavelCrianca;
    }

    public Boolean getFrequentaCurandeiro() {
        return frequentaCurandeiro;
    }

    public void setFrequentaCurandeiro(Boolean frequentaCurandeiro) {
        this.frequentaCurandeiro = frequentaCurandeiro;
    }

    public Boolean getParticipaGrupoComunitario() {
        return participaGrupoComunitario;
    }

    public void setParticipaGrupoComunitario(Boolean participaGrupoComunitario) {
        this.participaGrupoComunitario = participaGrupoComunitario;
    }

    public Boolean getPlanoSaudePrivado() {
        return planoSaudePrivado;
    }

    public void setPlanoSaudePrivado(Boolean planoSaudePrivado) {
        this.planoSaudePrivado = planoSaudePrivado;
    }

    public Boolean getMembroComunidade() {
        return membroComunidade;
    }

    public void setMembroComunidade(Boolean membroComunidade) {
        this.membroComunidade = membroComunidade;
    }

    public Boolean getInformarOrientacaoSexual() {
        return informarOrientacaoSexual;
    }

    public void setInformarOrientacaoSexual(Boolean informarOrientacaoSexual) {
        this.informarOrientacaoSexual = informarOrientacaoSexual;
    }

    public OrientacaoSexual getOrientacaoSexual() {
        return orientacaoSexual;
    }

    public void setOrientacaoSexual(OrientacaoSexual orientacaoSexual) {
        this.orientacaoSexual = orientacaoSexual;
    }

    public Boolean getPossuiDeficiencia() {
        return possuiDeficiencia;
    }

    public void setPossuiDeficiencia(Boolean possuiDeficiencia) {
        this.possuiDeficiencia = possuiDeficiencia;
    }

    public List<TipoDeficiencia> getTipoDeficiencia() {
        return tipoDeficiencia;
    }

    public void setTipoDeficiencia(List<TipoDeficiencia> tipoDeficiencia) {
        this.tipoDeficiencia = tipoDeficiencia;
    }

    public Boolean getSituacaoDeRua() {
        return situacaoDeRua;
    }

    public void setSituacaoDeRua(Boolean situacaoDeRua) {
        this.situacaoDeRua = situacaoDeRua;
    }

    public TempoSituacaoRua getTempoSituacaoRua() {
        return tempoSituacaoRua;
    }

    public void setTempoSituacaoRua(TempoSituacaoRua tempoSituacaoRua) {
        this.tempoSituacaoRua = tempoSituacaoRua;
    }

    public Boolean getAcompanhadoOutraInstituicao() {
        return acompanhadoOutraInstituicao;
    }

    public void setAcompanhadoOutraInstituicao(Boolean acompanhadoOutraInstituicao) {
        this.acompanhadoOutraInstituicao = acompanhadoOutraInstituicao;
    }

    public String getNomeOutraInstituicao() {
        return nomeOutraInstituicao;
    }

    public void setNomeOutraInstituicao(String nomeOutraInstituicao) {
        this.nomeOutraInstituicao = nomeOutraInstituicao;
    }

    public Boolean getRecebeAlgumBeneficio() {
        return recebeAlgumBeneficio;
    }

    public void setRecebeAlgumBeneficio(Boolean recebeAlgumBeneficio) {
        this.recebeAlgumBeneficio = recebeAlgumBeneficio;
    }

    public Boolean getPossuiReferenciaFamiliar() {
        return possuiReferenciaFamiliar;
    }

    public void setPossuiReferenciaFamiliar(Boolean possuiReferenciaFamiliar) {
        this.possuiReferenciaFamiliar = possuiReferenciaFamiliar;
    }

    public Boolean getFrequentaFamiliarFrequencia() {
        return frequentaFamiliarFrequencia;
    }

    public void setFrequentaFamiliarFrequencia(Boolean frequentaFamiliarFrequencia) {
        this.frequentaFamiliarFrequencia = frequentaFamiliarFrequencia;
    }

    public GrauParentesco getGrauParentesco() {
        return grauParentesco;
    }

    public void setGrauParentesco(GrauParentesco grauParentesco) {
        this.grauParentesco = grauParentesco;
    }

    public QuestionarioAutoReferido getQuestionarioAutoReferido() {
        return questionarioAutoReferido;
    }

    public void setQuestionarioAutoReferido(QuestionarioAutoReferido questionarioAutoReferido) {
        this.questionarioAutoReferido = questionarioAutoReferido;
    }

    public int getVersao() {
        return versao;
    }

    public void setVersao(int versao) {
        this.versao = versao;
    }

    public String getNomeComunidade() {
        return nomeComunidade;
    }

    public void setNomeComunidade(String nomeComunidade) {
        this.nomeComunidade = nomeComunidade;
    }

    public Boolean getBolsaFamilia() {
        return bolsaFamilia;
    }

    public void setBolsaFamilia(Boolean bolsaFamilia) {
        this.bolsaFamilia = bolsaFamilia;
    }

    public Boolean getMinhaCasaMinhaVida() {
        return minhaCasaMinhaVida;
    }

    public void setMinhaCasaMinhaVida(Boolean minhaCasaMinhaVida) {
        this.minhaCasaMinhaVida = minhaCasaMinhaVida;
    }

    public Boolean getImovelProprio() {
        return imovelProprio;
    }

    public void setImovelProprio(Boolean imovelProprio) {
        this.imovelProprio = imovelProprio;
    }

    public RendaFamiliar getRendaFamiliar() {
        return rendaFamiliar;
    }

    public void setRendaFamiliar(RendaFamiliar rendaFamiliar) {
        this.rendaFamiliar = rendaFamiliar;
    }

    public CadastroIndividual getCadastroHistorico() {
        return cadastroHistorico;
    }

    public void setCadastroHistorico(CadastroIndividual cadastroHistorico) {
        this.cadastroHistorico = cadastroHistorico;
    }

    public Boolean getAtual() {
        return atual;
    }

    public void setAtual(Boolean atual) {
        this.atual = atual;
    }

    public Profissional getProfissional() {
        return profissional;
    }

    public void setProfissional(Profissional profissional) {
        this.profissional = profissional;
    }

    public Boolean getAtivo() {
        return ativo;
    }

    public void setAtivo(Boolean ativo) {
        this.ativo = ativo;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 29 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 29 * hash + (this.digitadoPor != null ? this.digitadoPor.hashCode() : 0);
        hash = 29 * hash + (this.dataDigitado != null ? this.dataDigitado.hashCode() : 0);
        hash = 29 * hash + (this.conferidoPor != null ? this.conferidoPor.hashCode() : 0);
        hash = 29 * hash + (this.folhaNumero != null ? this.folhaNumero.hashCode() : 0);
        hash = 29 * hash + (this.profissional != null ? this.profissional.hashCode() : 0);
        hash = 29 * hash + (this.dataCadastro != null ? this.dataCadastro.hashCode() : 0);
        hash = 29 * hash + (this.cidadao != null ? this.cidadao.hashCode() : 0);
        hash = 29 * hash + (this.responsavelFamiliar != null ? this.responsavelFamiliar.hashCode() : 0);
        hash = 29 * hash + (this.cartaoResponsavelFamiliar != null ? this.cartaoResponsavelFamiliar.hashCode() : 0);
        hash = 29 * hash + (this.frequentaEscola != null ? this.frequentaEscola.hashCode() : 0);
        hash = 29 * hash + (this.tipoCurso != null ? this.tipoCurso.hashCode() : 0);
        hash = 29 * hash + (this.situacaoMercadoTrabalho != null ? this.situacaoMercadoTrabalho.hashCode() : 0);
        hash = 29 * hash + (this.responsavelCrianca != null ? this.responsavelCrianca.hashCode() : 0);
        hash = 29 * hash + (this.frequentaCurandeiro != null ? this.frequentaCurandeiro.hashCode() : 0);
        hash = 29 * hash + (this.participaGrupoComunitario != null ? this.participaGrupoComunitario.hashCode() : 0);
        hash = 29 * hash + (this.planoSaudePrivado != null ? this.planoSaudePrivado.hashCode() : 0);
        hash = 29 * hash + (this.membroComunidade != null ? this.membroComunidade.hashCode() : 0);
        hash = 29 * hash + (this.nomeComunidade != null ? this.nomeComunidade.hashCode() : 0);
        hash = 29 * hash + (this.informarOrientacaoSexual != null ? this.informarOrientacaoSexual.hashCode() : 0);
        hash = 29 * hash + (this.orientacaoSexual != null ? this.orientacaoSexual.hashCode() : 0);
        hash = 29 * hash + (this.possuiDeficiencia != null ? this.possuiDeficiencia.hashCode() : 0);
        hash = 29 * hash + (this.tipoDeficiencia != null ? this.tipoDeficiencia.hashCode() : 0);
        hash = 29 * hash + (this.situacaoDeRua != null ? this.situacaoDeRua.hashCode() : 0);
        hash = 29 * hash + (this.tempoSituacaoRua != null ? this.tempoSituacaoRua.hashCode() : 0);
        hash = 29 * hash + (this.acompanhadoOutraInstituicao != null ? this.acompanhadoOutraInstituicao.hashCode() : 0);
        hash = 29 * hash + (this.nomeOutraInstituicao != null ? this.nomeOutraInstituicao.hashCode() : 0);
        hash = 29 * hash + (this.recebeAlgumBeneficio != null ? this.recebeAlgumBeneficio.hashCode() : 0);
        hash = 29 * hash + (this.possuiReferenciaFamiliar != null ? this.possuiReferenciaFamiliar.hashCode() : 0);
        hash = 29 * hash + (this.frequentaFamiliarFrequencia != null ? this.frequentaFamiliarFrequencia.hashCode() : 0);
        hash = 29 * hash + (this.bolsaFamilia != null ? this.bolsaFamilia.hashCode() : 0);
        hash = 29 * hash + (this.minhaCasaMinhaVida != null ? this.minhaCasaMinhaVida.hashCode() : 0);
        hash = 29 * hash + (this.imovelProprio != null ? this.imovelProprio.hashCode() : 0);
        hash = 29 * hash + (this.rendaFamiliar != null ? this.rendaFamiliar.hashCode() : 0);
        hash = 29 * hash + (this.grauParentesco != null ? this.grauParentesco.hashCode() : 0);
        hash = 29 * hash + (this.questionarioAutoReferido != null ? this.questionarioAutoReferido.hashCode() : 0);
        hash = 29 * hash + (this.cadastroHistorico != null ? this.cadastroHistorico.hashCode() : 0);
        hash = 29 * hash + (this.atual != null ? this.atual.hashCode() : 0);
        hash = 29 * hash + (this.ativo != null ? this.ativo.hashCode() : 0);
        hash = 29 * hash + this.versao;
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final CadastroIndividual other = (CadastroIndividual) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if (this.digitadoPor != other.digitadoPor && (this.digitadoPor == null || !this.digitadoPor.equals(other.digitadoPor))) {
            return false;
        }
        if (this.dataDigitado != other.dataDigitado && (this.dataDigitado == null || !this.dataDigitado.equals(other.dataDigitado))) {
            return false;
        }
        if (this.conferidoPor != other.conferidoPor && (this.conferidoPor == null || !this.conferidoPor.equals(other.conferidoPor))) {
            return false;
        }
        if (this.folhaNumero != other.folhaNumero && (this.folhaNumero == null || !this.folhaNumero.equals(other.folhaNumero))) {
            return false;
        }
        if (this.profissional != other.profissional && (this.profissional == null || !this.profissional.equals(other.profissional))) {
            return false;
        }
        if (this.dataCadastro != other.dataCadastro && (this.dataCadastro == null || !this.dataCadastro.equals(other.dataCadastro))) {
            return false;
        }
        if (this.cidadao != other.cidadao && (this.cidadao == null || !this.cidadao.equals(other.cidadao))) {
            return false;
        }
        if (this.responsavelFamiliar != other.responsavelFamiliar && (this.responsavelFamiliar == null || !this.responsavelFamiliar.equals(other.responsavelFamiliar))) {
            return false;
        }
        if (this.cartaoResponsavelFamiliar != other.cartaoResponsavelFamiliar && (this.cartaoResponsavelFamiliar == null || !this.cartaoResponsavelFamiliar.equals(other.cartaoResponsavelFamiliar))) {
            return false;
        }
        if (this.frequentaEscola != other.frequentaEscola && (this.frequentaEscola == null || !this.frequentaEscola.equals(other.frequentaEscola))) {
            return false;
        }
        if (this.tipoCurso != other.tipoCurso) {
            return false;
        }
        if (this.situacaoMercadoTrabalho != other.situacaoMercadoTrabalho) {
            return false;
        }
        if (this.responsavelCrianca != other.responsavelCrianca) {
            return false;
        }
        if (this.frequentaCurandeiro != other.frequentaCurandeiro && (this.frequentaCurandeiro == null || !this.frequentaCurandeiro.equals(other.frequentaCurandeiro))) {
            return false;
        }
        if (this.participaGrupoComunitario != other.participaGrupoComunitario && (this.participaGrupoComunitario == null || !this.participaGrupoComunitario.equals(other.participaGrupoComunitario))) {
            return false;
        }
        if (this.planoSaudePrivado != other.planoSaudePrivado && (this.planoSaudePrivado == null || !this.planoSaudePrivado.equals(other.planoSaudePrivado))) {
            return false;
        }
        if (this.membroComunidade != other.membroComunidade && (this.membroComunidade == null || !this.membroComunidade.equals(other.membroComunidade))) {
            return false;
        }
        if ((this.nomeComunidade == null) ? (other.nomeComunidade != null) : !this.nomeComunidade.equals(other.nomeComunidade)) {
            return false;
        }
        if (this.informarOrientacaoSexual != other.informarOrientacaoSexual && (this.informarOrientacaoSexual == null || !this.informarOrientacaoSexual.equals(other.informarOrientacaoSexual))) {
            return false;
        }
        if (this.orientacaoSexual != other.orientacaoSexual) {
            return false;
        }
        if (this.possuiDeficiencia != other.possuiDeficiencia && (this.possuiDeficiencia == null || !this.possuiDeficiencia.equals(other.possuiDeficiencia))) {
            return false;
        }
        if (this.tipoDeficiencia != other.tipoDeficiencia && (this.tipoDeficiencia == null || !this.tipoDeficiencia.equals(other.tipoDeficiencia))) {
            return false;
        }
        if (this.situacaoDeRua != other.situacaoDeRua && (this.situacaoDeRua == null || !this.situacaoDeRua.equals(other.situacaoDeRua))) {
            return false;
        }
        if (this.tempoSituacaoRua != other.tempoSituacaoRua) {
            return false;
        }
        if (this.acompanhadoOutraInstituicao != other.acompanhadoOutraInstituicao && (this.acompanhadoOutraInstituicao == null || !this.acompanhadoOutraInstituicao.equals(other.acompanhadoOutraInstituicao))) {
            return false;
        }
        if ((this.nomeOutraInstituicao == null) ? (other.nomeOutraInstituicao != null) : !this.nomeOutraInstituicao.equals(other.nomeOutraInstituicao)) {
            return false;
        }
        if (this.recebeAlgumBeneficio != other.recebeAlgumBeneficio && (this.recebeAlgumBeneficio == null || !this.recebeAlgumBeneficio.equals(other.recebeAlgumBeneficio))) {
            return false;
        }
        if (this.possuiReferenciaFamiliar != other.possuiReferenciaFamiliar && (this.possuiReferenciaFamiliar == null || !this.possuiReferenciaFamiliar.equals(other.possuiReferenciaFamiliar))) {
            return false;
        }
        if (this.frequentaFamiliarFrequencia != other.frequentaFamiliarFrequencia && (this.frequentaFamiliarFrequencia == null || !this.frequentaFamiliarFrequencia.equals(other.frequentaFamiliarFrequencia))) {
            return false;
        }
        if (this.bolsaFamilia != other.bolsaFamilia && (this.bolsaFamilia == null || !this.bolsaFamilia.equals(other.bolsaFamilia))) {
            return false;
        }
        if (this.minhaCasaMinhaVida != other.minhaCasaMinhaVida && (this.minhaCasaMinhaVida == null || !this.minhaCasaMinhaVida.equals(other.minhaCasaMinhaVida))) {
            return false;
        }
        if (this.imovelProprio != other.imovelProprio && (this.imovelProprio == null || !this.imovelProprio.equals(other.imovelProprio))) {
            return false;
        }
        if (this.rendaFamiliar != other.rendaFamiliar) {
            return false;
        }
        if (this.grauParentesco != other.grauParentesco) {
            return false;
        }
        if (this.questionarioAutoReferido != other.questionarioAutoReferido && (this.questionarioAutoReferido == null || !this.questionarioAutoReferido.equals(other.questionarioAutoReferido))) {
            return false;
        }
        if (this.cadastroHistorico != other.cadastroHistorico && (this.cadastroHistorico == null || !this.cadastroHistorico.equals(other.cadastroHistorico))) {
            return false;
        }
        if (this.atual != other.atual && (this.atual == null || !this.atual.equals(other.atual))) {
            return false;
        }
        if (this.ativo != other.ativo && (this.ativo == null || !this.ativo.equals(other.ativo))) {
            return false;
        }
        if (this.versao != other.versao) {
            return false;
        }
        return true;
    }

    public CadastroIndividual getClone() {
        try {
            return (CadastroIndividual) super.clone();
        } catch (CloneNotSupportedException e) {
            System.out.println(" Cloning not allowed. ");
            return this;
        }
    }
}
